package br.com.foxinline.manager.historico;

import br.com.foxinline.modelo.Proprietario;
import br.com.foxinline.servico.ProprietarioServico;
import br.com.foxinline.servico.historico.ProprietarioHistoricoServico;
import br.com.foxinline.util.Msg;
import br.com.foxinline.vo.CamposVO;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

/**
 *
 * @author laverson
 */
@ViewScoped
@ManagedBean
public class ManagerHistoricoProprietario implements Serializable {

    @EJB
    ProprietarioServico proprietarioServico;
    @EJB
    ProprietarioHistoricoServico proprietarioHistoricoServico;
    private List<Proprietario> proprietarioHistoricos;
    private String historicoId;
    private Proprietario proprietarioHistorico;
    private Proprietario proprietarioHistoricoComparar;
    private List<CamposVO> campos;
    private Proprietario proprietarioRestaurar;

    @PostConstruct
    public void init() {
        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        this.historicoId = params.get("historico");
        paramPost();
    }

    public void paramPost() {
        try {
            if (this.historicoId != null) {
                this.proprietarioHistoricos = this.proprietarioHistoricoServico.history(Long.parseLong(this.historicoId));
            }
        } catch (Exception e) {
            System.err.println(e);
        }
    }

    /**
     * Compara se os campos do parâmetro bairro são diferentes do seu antecessor
     * na lista de históricos. Grava os campos e os seus valores para exibição
     *
     * <br/> <p> <b>Author:</b> Diego Laverson</p>
     *
     * @param proprietario
     */
    public void comparar(Proprietario proprietario) {

        int index = this.proprietarioHistoricos.indexOf(proprietario);

        if (index == this.proprietarioHistoricos.size() - 1) {
            this.proprietarioHistoricoComparar = this.proprietarioServico.find(Long.parseLong(this.historicoId));
        } else {
            this.proprietarioHistoricoComparar = this.proprietarioHistoricos.get(index + 1);
        }

        this.proprietarioHistorico = (Proprietario) this.proprietarioHistoricoServico.comparar(proprietario, this.proprietarioHistoricoComparar, false);
        this.proprietarioHistorico.setDataAtualizacao(proprietario.getDataAtualizacao());

        this.campos = this.proprietarioHistoricoServico.getCampos();
    }

    /**
     * Restaura os dados que foram modificados com relação ao
     * <b>bairroRestaurar</b> e o bairro que está sendo verificado o histórico
     *
     * <br/> <p> <b>Author:</b> Diego Laverson</p>
     */
    public void restaurar() {
        try {

            Proprietario proprietario = this.proprietarioServico.find(Long.parseLong(this.historicoId));

            proprietario = (Proprietario) this.proprietarioHistoricoServico.comparar(this.proprietarioRestaurar, proprietario, true);

            proprietarioServico.update(proprietario);

            Msg.messagemInfo(Msg.SuccessFull);

        } catch (Exception e) {

            System.err.println(e);
            Msg.messagemError(Msg.Failure);
        }
    }

    public List<Proprietario> getProprietarioHistoricos() {
        return proprietarioHistoricos;
    }

    public void setProprietarioHistoricos(List<Proprietario> proprietarioHistoricos) {
        this.proprietarioHistoricos = proprietarioHistoricos;
    }

    public Proprietario getProprietarioHistorico() {
        return proprietarioHistorico;
    }

    public void setProprietarioHistorico(Proprietario proprietarioHistorico) {
        this.proprietarioHistorico = proprietarioHistorico;
    }

    public Proprietario getProprietarioHistoricoComparar() {
        return proprietarioHistoricoComparar;
    }

    public void setProprietarioHistoricoComparar(Proprietario proprietarioHistoricoComparar) {
        this.proprietarioHistoricoComparar = proprietarioHistoricoComparar;
    }

    public List<CamposVO> getCampos() {
        return campos;
    }

    public void setCampos(List<CamposVO> campos) {
        this.campos = campos;
    }

    public Proprietario getProprietarioRestaurar() {
        return proprietarioRestaurar;
    }

    public void setProprietarioRestaurar(Proprietario proprietarioRestaurar) {
        this.proprietarioRestaurar = proprietarioRestaurar;
    }
}
